//
//  JKBrowserCell.swift
//  JKWeibo
//
//  Created by albert on 16/6/24.
//  Copyright © 2016年 albert. All rights reserved.
//  图片浏览器的cell

import UIKit
import SDWebImage
import SVProgressHUD

protocol JKBrowserCellDelegate: NSObjectProtocol {
    // 配图浏览器即将退出
    func browserCellWillDismiss(browserCell: JKBrowserCell)
}

class JKBrowserCell: UICollectionViewCell {
    
    /** 代理 */
    weak var delegate: JKBrowserCellDelegate?
    
    /** 缩略图 */
    var thumbPic: UIImage?
    
    /** 缩略图URL */
    var thumbUrl: NSURL? {
        didSet {
            if let image =  SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(thumbUrl?.absoluteString) {
                
                thumbPic = image
                
                setupPicture(image)
            }
        }
    }
    
    /** 大图URL */
    var bmiddleUrl: NSURL? {
        didSet{
            
            imageView.sd_setImageWithURL(bmiddleUrl, placeholderImage: thumbPic, options: SDWebImageOptions(rawValue: 0), progress: { (current, total) -> Void in
                // 进度
                self.imageView.progress = CGFloat(current) / CGFloat(total)
                
                }) { (image, error, _, _) -> Void in
                    
                    if (error != nil) || (image == nil) {
                        SVProgressHUD.showErrorWithStatus("加载图片失败")
                        SVProgressHUD.setDefaultMaskType(SVProgressHUDMaskType.Black)
                        JKDispatchTool.after(JKTipDuration) { () -> Void in
                            SVProgressHUD.dismiss()
                        }
                        
                        return
                    }
                    
                    self.imageView.progress = 1
                    
                    // 0.重置容器内所有视图
                    self.resetView()
                    
                    // 1.设置图片尺寸和位置
                    self.setupPicture(image)
            }
        }
    }
    
    /** 设置图片尺寸和位置 */
    private func setupPicture(image: UIImage) {
        let scale = image.size.width / image.size.height
        let imageWidth = JKScreenW
        let imageHeight = imageWidth / scale
        
        // 2.设置图片frame
        self.imageView.frame = CGRect(origin: CGPointZero, size: CGSize(width: imageWidth, height: imageHeight))
        
        // 3.计算顶部和底部内边距
        let offsetY = (JKScreenH - imageHeight) * 0.5
        
        // 4.设置图片位置
        if imageHeight > JKScreenH { // 计算后的图片高度 > 屏幕高度
            // 设置contentSize，让长图可以滚动
            self.scrollView.contentSize = CGSize(width: imageWidth, height: imageHeight)
            
            // 长图滚到底部翻页后再回来，让它自动回到顶部
            self.scrollView.contentOffset = CGPointZero
            
        }else { // 计算后的图片高度 <= 屏幕高度
            // 居中显示使用contentInset，注意底部也要写上，否则可能会出现位置偏移的问题
            self.scrollView.contentInset = UIEdgeInsets(top: offsetY, left: 0, bottom: offsetY, right: 0)
        }
    }
    
    /** 重置容器内所有视图 */
    private func resetView() {
        scrollView.contentOffset = CGPointZero
        scrollView.contentInset = UIEdgeInsetsZero
        scrollView.contentSize = CGSizeZero
        
        // 放大图片实质就是transform形变
        imageView.transform = CGAffineTransformIdentity
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        // 初始化
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    /** 初始化 */
    private func setupUI() {
        // 1.添加子控件
        contentView.addSubview(scrollView)
        scrollView.addSubview(imageView)
        
        // 2.布局子控件
        // 此处frame不能使用cell的frame，因为第二个cell的frame的x是375，就显示不出来了
        scrollView.frame = JKScreenBounds//self.frame
    }
    
    /** 退出 */
    func dismiss() {
        delegate?.browserCellWillDismiss(self)
    }
    
    // MARK: - 懒加载
    private lazy var scrollView: UIScrollView = {
        let scrv = UIScrollView()
        
        scrv.delegate = self
        scrv.minimumZoomScale = 1;
        scrv.maximumZoomScale = 2;
        
        scrv.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "dismiss"))
        
        return scrv
    }()
    
    private lazy var imageView: JKProgressImageView = JKProgressImageView(frame: CGRectZero)
    
}

extension JKBrowserCell: UIScrollViewDelegate {
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        return imageView
    }
    
    // 在缩放过程中不断调整位置，使用contentInset
    func scrollViewDidZoom(scrollView: UIScrollView) {
        //JKLog(imageView.bounds) // 从头至尾没有变化
        //JKLog(imageView.frame)  // 相当于contentSize
        //JKLog(scrollview.contentSize)
        
        // 计算内边距，注意只能使用frame
        var offsetX = (JKScreenW - imageView.width) * 0.5
        var offsetY = (JKScreenH - imageView.height) * 0.5
        
        // 当小于0的时候，放大的图片将无法滚动，因为内边距为负数时限制了它可以滚动的范围
        offsetX = (offsetX < 0) ? 0 : offsetX
        offsetY = (offsetY < 0) ? 0 : offsetY
        
        self.scrollView.contentInset = UIEdgeInsets(top: offsetY, left: offsetX, bottom: offsetY, right: offsetX)
    }
}
